-- 2022-8-9

--[[14.0 数据结构
    Lua语言中的表并不是一种数据结构 它们是其他数据结构的基础
    我们可以用Lua语言中的表来实现其他语言提供的数据结构 如数组 记录 列表 队列 集合等
    而且 用lua语言中的表实现这些数据结构还很高效

    在像C和Pascal这样更加传统的语言中 通常使用数组和列表(列表=记录+指针)来实现大多数数据结构
    虽然在Lua语言中也可以使用表来实现数据结构和列表(有时确实我们也这么做) 但实际上表比数组和列表强大的多
    使用表时 很多算法可以被简化
    例如 由于表本身就支持任意数据类型的直接访问 因此我们很少在Lua语言中编写搜索算法

    学习如何高效的使用表需要花费一点时间
    这里我们先来学习如何通过表来实现一些典型的数据结构并给出一些使用这些数据结构的例子
    首先 我们学习数组和列表 这并不是因为需要它们作为其他结构的基础 而是因为大多数程序员已经对数组和列表比骄傲熟悉了
    之后再学习更加高级的例子 比如集合 包 和 图
]]

---[[14.1 数组

    -- 在Lua语言中 简单的使用整数来索引表即可实现数组 因此 数组的大小不用非得是固定的 而是可以按需求增长的
    -- 通常 在初始化数组时就间接的定义了数组的大小
    -- 长度运算符#计算数组的大小
    -- 例如 在执行了以下代码后 任何访问范围1~1000之外的元素都会返回nil而不是0
    do
        local a = {}
        for i = 1, 1000 do
            a[i] = 0
        end
        print(#a) -- 长度运算符#计算数组的大小
    end
    -- 可以使用0 1或其他任何值来作为数组的起始索引
    -- 创建一个索引范围为-5-5的数组
    do
        local a = {}
        for i = -5, 5 do
            a[i] = 0
        end
        print(#a) -- 5
    end
    -- 不过 在Lua语言中一般以1作为数组的起始索引
    -- Lua语言的标准库和长度运算符都遵循这个惯例
    -- 如果索引不从1开始就不能使用这些机制

    -- 可以通过表构造器在一句表达式中同时创建和初始化数组
    local squares = {1,4,5,3,2,547,7,89}
    -- 这种表构造器根据需求要多大就能多大
    -- 在Lua语言中 利用数据描述文件创建包含几百万个元素组成的构造器很常见
--]]